package fr.thelem.gestiondemandesthelem.web.actions;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.security.core.context.SecurityContextHolder;

import fr.thelem.gestiondemandesthelem.dao.model.AdministrateurEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CDDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CDParametreDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CDParametreDemandeValeursEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CPDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CPEtapeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CPParametreDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CommentairesEntity;
import fr.thelem.gestiondemandesthelem.dao.model.EtatEntity;
import fr.thelem.gestiondemandesthelem.dao.model.PersonneEntity;
import fr.thelem.gestiondemandesthelem.service.IAppliService;

public class ModifierDemandeAction extends BaseAction {

    /** Attribut serialVersionUID */
    private static final long serialVersionUID = -9182069118737661089L;

    /**
     * {@inheritDoc}
     */
    private String idDemande;
    private String iduneDemande;
    private CPDemandeEntity CPDemande;
    private CDDemandeEntity CDDemande;
    private CPDemandeEntity CPDemandeWithEtape;
    private Map modifier = new HashMap();
    private Map<String, List<String>> map = new HashMap();
    
    private String NomDemande;
    private String NomUtilisateur;
    private String TypeDemande;
    private String EtatDemande;
    private String DateDemande;
    private String CodeProjetDemande;
    private String ChargeDemande;
    private String ReferenceDemande;
    private String CommentaireDemande;
    private String idLaDemande;
    private String idCommentaire;
    private String paramDemande;
    private String paramDemandeMultiple;
    private String idParamDemande;
    private String idParamDemandeMultiple;
    private String valeurChoisie;
    private String etat;
    private String EtapeChoisit;
    private int idDem;
    private ArrayList<String> valeursMultiple;
    
    private Collection<CDParametreDemandeValeursEntity> colec;
    private Collection<CPParametreDemandeEntity> lesCPParam;
    private Collection<CDParametreDemandeEntity> lesCDParam;
    private Collection<CommentairesEntity> lesCommentaires;
    private Collection<String> lesetats = new ArrayList<String>();
    private List<String> Letats = new ArrayList<String>();
    
    private IAppliService appliService;

    
    /**
     * Fonction d'initialisation, permet de re-remplir la page après appui sur un bouton
     * 
     * @return
     * @throws Exception
     */    
    public void initialiser(){
    	
        int idCPDemande = Integer.parseInt(idDemande);
        CPDemande = appliService.recupererCPDemandeById(idCPDemande);
        NomDemande = CPDemande.getTitreCPDemande();
        
        
        //Collection<CDParametreDemandeValeursEntity> lesVals;
        for (CPParametreDemandeEntity paramDemandes : CPDemande.getParametreDemandeCPDemandes()) {
        	List<String> li = new ArrayList<String>();
        	if (paramDemandes.getCDParametresDemandeCPParametreDemande().getTypeSaisieParametreDemande().equals("select") || paramDemandes.getCDParametresDemandeCPParametreDemande().getTypeSaisieParametreDemande().equals("selectmultiple")) {
        		//lesVals = paramDemandes.getCDParametresDemandeCPParametreDemande().getCDParametresDemandeValeursCDParametreDemande();
        		colec = appliService.recupererCDParametreDemandeValeurs(paramDemandes.getCDParametresDemandeCPParametreDemande().getIdentifiantParametreDemande());
        		for (CDParametreDemandeValeursEntity tit : colec){
        			li.add(tit.getValeurCDParametreDemandeValeurs());
        		}
        		
        		this.map.put(paramDemandes.getCDParametresDemandeCPParametreDemande().getNomParametreDemande(),li );
        		
        		if (paramDemandes.getCDParametresDemandeCPParametreDemande().getTypeSaisieParametreDemande().equals("selectmultiple")) {
        			valeursMultiple = new ArrayList<String>();
        			String[] spl = paramDemandes.getValeurCPParametreDemande().split(",");
        			for (int g=0; g<spl.length; g++) {
        				valeursMultiple.add(spl[g]);
        			}
        		}
        	}
        }
        
        
      /*  lesCPParam = CPDemande.getParametreDemandeCPDemandes();
        lesCDParam = CPDemande.getCDDemandeCPDemande().getCDParametresDemandeCDDemande();
        ArrayList<CPParametreDemandeEntity> list = (ArrayList<CPParametreDemandeEntity>) lesCPParam;
        list.get(0).getIdentifiantCPParametreDemande()
        */
        
        /*
        NomUtilisateur = CPDemande.getPersonneEffectueCPDemande().getLdapPersonne();
        TypeDemande = CPDemande.getCDDemandeCPDemande().getTypeDemandeCDDemande().getNomTypeDemande();
        EtatDemande = CPDemande.getEtatCPDemande().getNomEtat();
        */
        SimpleDateFormat formatDateJour = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy"); 
        DateDemande = formatDateJour.format(CPDemande.getDateCPDemande());
        CodeProjetDemande = CPDemande.getCodeProjetCPDemande();
        ChargeDemande = CPDemande.getChargeCPDemande();
        ReferenceDemande = CPDemande.getReferenceCPDemande();
        lesCommentaires = appliService.recupererCommentairesDemande(idCPDemande);
        EtatDemande = CPDemande.getEtatCPDemande().getNomEtat();
        
        
        /* ------- les étapes ---------- */
        
        CPDemandeWithEtape = appliService.recuperCPDemandeWithEtapes(idCPDemande);
        
        //workflow point 5
        int cpt=0;
        int cpt2=0;
        int cptClose=0;
        for (CPEtapeEntity e : this.CPDemandeWithEtape.getEtapesCPDemande()){
        	if (e.getEtatCPEtape().getNomEtat().equals("En cours de traitement") ||e.getEtatCPEtape().getNomEtat().equals("Close")) {
        		cpt++;
        	}
        	if (e.getEtatCPEtape().getNomEtat().equals("Close")){
        		cptClose++;
        	}
        	cpt2++;
        }
        if (cpt>=1 && cpt < cpt2){
        	EtatEntity ee = new EtatEntity();
        	ee.setNomEtat("En cours de traitement");
        	CPDemande.setEtatCPDemande(ee);
        }
        if (cptClose == cpt2){
        	EtatEntity ee = new EtatEntity();
        	ee.setNomEtat("Close");
        	CPDemande.setEtatCPDemande(ee);
        }
        
        //this.lesetats = appliService.recupererEtat();
        this.lesetats.add("En attente");
        this.lesetats.add("En cours de traitement");
        this.lesetats.add("Close");
        Letats.addAll(appliService.recupererEtat());
    }
    
    public void initialiser2(int idDemand) {
    	this.idDem=idDemand;
    	idLaDemande = String.valueOf(idDemand);
    	System.out.println("init 2 :"+idLaDemande);
    	CPDemande = appliService.recupererCPDemandeById(idDemand);
        NomDemande = CPDemande.getTitreCPDemande();
        
        SimpleDateFormat formatDateJour = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy"); 
        DateDemande = formatDateJour.format(CPDemande.getDateCPDemande());
        CodeProjetDemande = CPDemande.getCodeProjetCPDemande();
        ChargeDemande = CPDemande.getChargeCPDemande();
        ReferenceDemande = CPDemande.getReferenceCPDemande();
        lesCommentaires = appliService.recupererCommentairesDemande(idDemand);
    }
    
    public String execute() throws Exception {

        initialiser();
        
        return "success";
    }
    
    
    /**
     * Traitement du formulaire de modification de toutes les informations sur la demande ainsi que ses
     * paramètres et étapes. Plus rajout du commentaire saise
     * 
     * @return
     * @throws Exception
     */    
    public String modifierdemandeForm() throws Exception {


    	/* ------------ Identifiant Demande : Récupération de la demande concernée -------- */
    	
        idDemande = idLaDemande;
        int idCPDemande = Integer.parseInt(idDemande);
        CPDemande = appliService.recupererCPDemandeById(idCPDemande);
        
        /* ------------ Commentaires : Ajout des nouveaux commentaires -------- */
        
       // PersonneEntity p = new AdministrateurEntity(); // on ne peut pas encore récupérer l'auteur de la demande
        PersonneEntity personne = appliService.recupererPersonne(SecurityContextHolder.getContext().getAuthentication().getName());
        if (!CommentaireDemande.equals("")) {
        	appliService.ajouterUnCommentaire(CommentaireDemande, personne, CPDemande);
        	appliService.modifierDateDernierEtatDemande(idCPDemande);
        }
        
        
        /* ------------ Paramètres  : modifier les paramètres de la demande -------- */
        
        String[] multipl = paramDemandeMultiple.split(", ");
        String paramMult = "";
        if (multipl.length >= 2) {
        	paramMult = multipl[0] +","+multipl[1];
        }
        else if (multipl.length == 1){
        	paramMult = paramDemandeMultiple;
        } 
        
        paramDemande= paramDemande+ ", "+paramMult;
        this.idParamDemande = this.idParamDemande + ", " +idParamDemandeMultiple;
        System.out.println("pametreeeeeeeeeeeee "+ paramDemande);
        System.out.println("pametreeeeeeeeeeeee "+ idParamDemande);
        System.out.println("pametreeeeeeeeeeeee "+ this.idParamDemandeMultiple);
        
       
        appliService.modifierCPDemande(idCPDemande, NomDemande, CodeProjetDemande, 
        								ChargeDemande, ReferenceDemande);
        appliService.modifierCPParametreValeur(idCPDemande, idParamDemande, paramDemande);
        
        
        /* ------------ Etape : modifier les états des étapes -------- */
        
     // Si plusieurs état dans le tableau, this.etat va recuperer le tout sous forme de "etat1, etat2, etat3..." donc découpage
       	String lesEtatsAffichés[] = this.etat.split(", ");
       	String lesEtapesAffichés[] = this.EtapeChoisit.split(", ");
       	String idDeLaDemande[] = idDemande.split(", ");
       	int convertEtapInt;
       	
       	int idleCPDemande = Integer.parseInt(this.idDemande);
       	
       	CPDemandeWithEtape = appliService.recuperCPDemandeWithEtapes(idleCPDemande);
       	int taille = CPDemandeWithEtape.getEtapesCPDemande().size();
       	int j =0;
      /*  for (Iterator i = ModifierEtatConsult.keySet().iterator(); i.hasNext();) {*/
       	for (int i=0; i<taille;i++) {
        	convertEtapInt = Integer.parseInt(lesEtapesAffichés[j]);
          //  int idEtape = Integer.valueOf((String) i.next());
            System.out.println("tessssssssst " +lesEtatsAffichés[j] +" zzzzzzz "+ convertEtapInt);
            appliService.modifierEtatCPEtape(convertEtapInt, lesEtatsAffichés[j]);
            appliService.modifierDateDernierEtatDemande(idleCPDemande);
            j++;
        }
        
        /* ------------ Initialisation -------- */
        
        initialiser();
        return SUCCESS;
    }
    
    /**
     * Ré-Ouvrir une demande invalidée (la mettre à l'état Ré-Ouverte)
     * 
     * @return
     * @throws Exception
     */    
    public String ReOuvrirDemande() throws Exception {
    	
    	idDemande = idLaDemande;
        int idCPDemande = Integer.parseInt(idLaDemande);
       // CPDemande = appliService.recupererCPDemandeById(idCPDemande);
        System.out.println("fffefefefefefef "+idCPDemande);
        appliService.modifierEtatDemande(idCPDemande, "Ré-ouverte");
        
    	initialiser();
    	return SUCCESS;
    }
    
    /**
     * Supprimer un commentaire
     * 
     * @return
     * @throws Exception
     */    
    public String suppCommentaire() throws Exception {
    	this.getIdDemande();
    	this.getIdLaDemande();
    	this.getIduneDemande();
    	int idCom = Integer.parseInt(idCommentaire);
    	CommentairesEntity com = appliService.recupererCommentairesDemandeByID(idCom);

    	appliService.supprimerCommentaire(idCom);
    	/*Collection<CommentairesEntity> tousCom = appliService.recupererCommentaires();
    	CommentairesEntity leCom = new CommentairesEntity();
    	for (CommentairesEntity c : tousCom) {
    		if (c.getIdentifiantCommentaire() == idCom) {
    			leCom = c;
    			System.out.println("tssskf jgj egiej é");
    		}
    	}*/
    	
    	System.out.println("ID 2 de la demande renvoyé : " + iduneDemande + " gegeg " + this.getIduneDemande());
    	
    	CPDemandeEntity d = com.getCPDemandeCommentaire();
    	//int idD = Integer.parseInt(iduneDemande);
    	System.out.println("ID 3 de la demande renvoyé : " + d.getIdentifiantCPDemande());
    	
    	this.idDemande = String.valueOf(d.getIdentifiantCPDemande());
    	
    	
    	initialiser();
    	//initialiser2(d.getIdentifiantCPDemande());
    	return SUCCESS;
    }

    /**
     * Accesseur de idDemande
     * 
     * @return le idDemande
     */
    public String getIdDemande() {
        return idDemande;
    }

    /**
     * Affectation de idDemande
     * 
     * @param idDemande idDemande à affecter
     */
    public void setIdDemande(String idDemande) {
        this.idDemande = idDemande;
    }

    /**
     * Accesseur de cPDemande
     * 
     * @return le cPDemande
     */
    public CPDemandeEntity getCPDemande() {
        return CPDemande;
    }

    /**
     * Affectation de cPDemande
     * 
     * @param cPDemande cPDemande à affecter
     */
    public void setCPDemande(CPDemandeEntity cPDemande) {
        CPDemande = cPDemande;
    }

    /**
     * Accesseur de appliService
     * 
     * @return le appliService
     */
    public IAppliService getAppliService() {
        return appliService;
    }

    /**
     * Affectation de appliService
     * 
     * @param appliService appliService à affecter
     */
    public void setAppliService(IAppliService appliService) {
        this.appliService = appliService;
    }

    /**
     * Accesseur de cDDemande
     * 
     * @return le cDDemande
     */
    public CDDemandeEntity getCDDemande() {
        return CDDemande;
    }

    /**
     * Affectation de cDDemande
     * 
     * @param cDDemande cDDemande à affecter
     */
    public void setCDDemande(CDDemandeEntity cDDemande) {
        CDDemande = cDDemande;
    }

	public CPDemandeEntity getCPDemandeWithEtape() {
		return CPDemandeWithEtape;
	}

	public void setCPDemandeWithEtape(CPDemandeEntity cPDemandeWithEtape) {
		CPDemandeWithEtape = cPDemandeWithEtape;
	}

	public String getNomDemande() {
		return NomDemande;
	}

	public void setNomDemande(String nomDemande) {
		NomDemande = nomDemande;
	}

	public String getNomUtilisateur() {
		return NomUtilisateur;
	}

	public void setNomUtilisateur(String nomUtilisateur) {
		NomUtilisateur = nomUtilisateur;
	}

	public String getTypeDemande() {
		return TypeDemande;
	}

	public void setTypeDemande(String typeDemande) {
		TypeDemande = typeDemande;
	}

	public String getEtatDemande() {
		return EtatDemande;
	}

	public void setEtatDemande(String etatDemande) {
		EtatDemande = etatDemande;
	}

	public String getDateDemande() {
		return DateDemande;
	}

	public void setDateDemande(String dateDemande) {
		DateDemande = dateDemande;
	}

	public String getCodeProjetDemande() {
		return CodeProjetDemande;
	}

	public void setCodeProjetDemande(String codeProjetDemande) {
		CodeProjetDemande = codeProjetDemande;
	}

	public String getChargeDemande() {
		return ChargeDemande;
	}

	public void setChargeDemande(String chargeDemande) {
		ChargeDemande = chargeDemande;
	}

	public String getReferenceDemande() {
		return ReferenceDemande;
	}

	public void setReferenceDemande(String referenceDemande) {
		ReferenceDemande = referenceDemande;
	}

	public String getCommentaireDemande() {
		return CommentaireDemande;
	}

	public void setCommentaireDemande(String commentaireDemande) {
		CommentaireDemande = commentaireDemande;
	}

	public Map getModifier() {
		return modifier;
	}

	public void setModifier(Map modifier) {
		this.modifier = modifier;
	}

	public Map<String, List<String>> getMap() {
		return map;
	}

	public void setMap(Map<String, List<String>> map) {
		this.map = map;
	}

	public String getIdLaDemande() {
		return idLaDemande;
	}

	public void setIdLaDemande(String idLaDemande) {
		this.idLaDemande = idLaDemande;
	}

	public String getIdCommentaire() {
		return idCommentaire;
	}

	public void setIdCommentaire(String idCommentaire) {
		this.idCommentaire = idCommentaire;
	}

	public Collection<CPParametreDemandeEntity> getLesCPParam() {
		return lesCPParam;
	}

	public void setLesCPParam(Collection<CPParametreDemandeEntity> lesCPParam) {
		this.lesCPParam = lesCPParam;
	}

	public Collection<CDParametreDemandeEntity> getLesCDParam() {
		return lesCDParam;
	}

	public void setLesCDParam(Collection<CDParametreDemandeEntity> lesCDParam) {
		this.lesCDParam = lesCDParam;
	}

	public String getParamDemande() {
		return paramDemande;
	}

	public void setParamDemande(String paramDemande) {
		this.paramDemande = paramDemande;
	}

	public String getIdParamDemande() {
		return idParamDemande;
	}

	public void setIdParamDemande(String idParamDemande) {
		this.idParamDemande = idParamDemande;
	}

	public String getValeurChoisie() {
		return valeurChoisie;
	}

	public void setValeurChoisie(String valeurChoisie) {
		this.valeurChoisie = valeurChoisie;
	}

	public Collection<CommentairesEntity> getLesCommentaires() {
		return lesCommentaires;
	}

	public void setLesCommentaires(Collection<CommentairesEntity> lesCommentaires) {
		this.lesCommentaires = lesCommentaires;
	}

	public Collection<String> getLesetats() {
		return lesetats;
	}

	public void setLesetats(Collection<String> lesetats) {
		this.lesetats = lesetats;
	}

	public List<String> getLetats() {
		return Letats;
	}

	public void setLetats(List<String> letats) {
		Letats = letats;
	}

	public String getIduneDemande() {
		return iduneDemande;
	}

	public void setIduneDemande(String iduneDemande) {
		this.iduneDemande = iduneDemande;
	}

	public Collection<CDParametreDemandeValeursEntity> getColec() {
		return colec;
	}

	public void setColec(Collection<CDParametreDemandeValeursEntity> colec) {
		this.colec = colec;
	}

	public int getIdDem() {
		return idDem;
	}

	public void setIdDem(int idDem) {
		this.idDem = idDem;
	}

	public String getParamDemandeMultiple() {
		return paramDemandeMultiple;
	}

	public void setParamDemandeMultiple(String paramDemandeMultiple) {
		this.paramDemandeMultiple = paramDemandeMultiple;
	}

	public String getIdParamDemandeMultiple() {
		return idParamDemandeMultiple;
	}

	public void setIdParamDemandeMultiple(String idParamDemandeMultiple) {
		this.idParamDemandeMultiple = idParamDemandeMultiple;
	}

	public String getEtat() {
		return etat;
	}

	public void setEtat(String etat) {
		this.etat = etat;
	}

	public String getEtapeChoisit() {
		return EtapeChoisit;
	}

	public void setEtapeChoisit(String etapeChoisit) {
		EtapeChoisit = etapeChoisit;
	}

	public ArrayList<String> getValeursMultiple() {
		return valeursMultiple;
	}

	public void setValeursMultiple(ArrayList<String> valeursMultiple) {
		this.valeursMultiple = valeursMultiple;
	}
    
	

}
